/**
 * 用于对数据字典中的分类信息进行维护的类 1.业务数据项分类 2.指标分类 3.查询方案分类 4.主题分类 功能： 1.新增一个树的节点，即新增一个分类
 * 2.删除一个树的节点，即删除一个分类 3.修改一个节点，可以拖动改变其位置关系，也可以修改其名称 参数： groupType即CATALOGUEID
 * 传递至后台的参数: 用-2表示某节点下的第一个子节点 调用：
 * 
 * var dg=new DGroupManage(g_id);//初始化分类管理，g_id为分类编号 var
 * gp=dg.getDGMCmp();//获取管理分类的容器，容器内包含了管理分类的树
 * 
 * author:sp 创建于09-07-17
 */
/* 设置默认图标 */
Ext.BLANK_IMAGE_URL = basePath + 'ext/resources/images/default/s.gif';
Ext.SSL_SECURE_URL = basePath + 'ext/resources/images/default/s.gif';

DGroupManage = function(groupType) {
	var dataUrl = basePath
			+ 'JarpListener?className=cn.com.zsc.system.GroupManage';

	/*
	 * ddArray中的格式为[nodeCode,pNodeCode_nodePos]保存拖动的操作
	 */
	var ddArray = new Array();
	/** ****************************用于显示分类的树，该树可直接对分类信息进行维护******************** */
	var groupTree = new Ext.tree.TreePanel({
		enableDD : true,
		animate : true,
		frame : false,
		border : false,
		region : 'center',
		autoScroll : true,
		tbar : ['' ,{
			iconCls : 'add',
			text : '新增同级',
			handler : function() {
				addequalNode();
			}
		}, '-', {
			iconCls : 'add',
			text : '新增下级',
			handler : function() {
				addNode();
			}
		}, '-', {
			iconCls : 'modify',
			text : '编辑',
			handler : function() {
				editNode();
			}
		}, '-', {
			iconCls : 'delete',
			text : '删除',
			handler : function() {
				delNode();
			}
		}, '-', {
			iconCls : 'save',
			text : '保存配置',
			handler : function() {
				saveNodes();
			}
		}
		],
		root : new Ext.tree.AsyncTreeNode({
			text : groupType,
			id : '-1'
		}),
		rootVisible : false,
		listeners : {
			'beforeload' : gT_beforeload,
			'click' : gT_click,
			'dblclick' : gT_click,
			'append' : gT_apd,
			'nodedrop' : gT_nodedrop
		}
	});
	function gT_beforeload(node) {
		var pid = '-1';
		
		if (node.getDepth() != 0) {
			pid = node.attributes.clCode;
		}
		var loadUrl = dataUrl + '&methodName=getGroup&paramCount=2&param_0='
				+ groupType + '&param_1=' + pid;
		node.loader = new Ext.tree.TreeLoader({
			dataUrl : loadUrl
		});
	}
	function gT_apd(tree, tnode, node) {
		if (node.leaf) {
			node.leaf = false;
			node.attributes.leaf = false;
			node.ui.wasLeaf = true;
		}
	}
	function gT_click(node, e) {
		Ext.mytree.resetBoldNodes(groupTree.getRootNode());
		node.getUI().addClass('selitem');
		node.toggle();
	}
	/* 节点放下的时候 */
	function gT_nodedrop(e) {
		var node = e.target;// 目标节点
		var cnode = e.data.node;// 该节点
		
		var pnode = e.data.node.parentNode;// 父节点
		var nodePos = cnode.previousSibling
				? parseInt(cnode.previousSibling.attributes.sort) + 1
				: '0';// 该节点当前的位置
		var dd = [cnode.id, pnode.id + '_' + nodePos];
		var isHas = false;
		for (var i = 0; i < ddArray.length; i++) {
			if (ddArray[i][0] == cnode.id) {
				ddArray[i] = dd;
				isHas = true;
				break;
			}
		}
		if (!isHas) {
			ddArray.push(dd);
		}
	}
	/* 取消节点的焦点，用与增加节点到根下 */
	function unselect() {
		var eNode = groupTree.getSelectionModel().getSelectedNode();
		if (eNode)
			eNode.unselect();
	}
	/* 保存节点结构 */
	function saveNodes() {
		if (ddArray.length != 0) {
			var saveUrl = dataUrl
					+ '&methodName=saveNodes&paramCount=1&param_0=' + groupType;
			content_panel.body.mask('正在保存配置...', 'x-mask-loading');
			Ext.http.send(saveUrl, function(resText) {
				if (resText == 'success') {
					Ext.Msg.alert('提示', '&nbsp;&nbsp;&nbsp;&nbsp;保存成功&nbsp;&nbsp;&nbsp;&nbsp;');
					groupTree.root.reload();
				} else {
					Ext.Msg.alert('提示', '保存失败:' + resText);
				}
				content_panel.body.unmask();
			}, Ext.encode(ddArray));
			
		} else {
			Ext.Msg.alert('提示', '在树节点顺序变换时才需保存，当前节点顺序没有改变，保存终止');
		}
	}
	/* 新增一个节点 */
	function addNode() {
		propW.flg = '0';
		propW.setTitle('新增下级');
		propW.show();
	}
	function addequalNode() {
		var record = groupTree.getSelectionModel().getSelectedNode();
		if(!record){
		Ext.Msg.alert("提示","没有选择节点，请选择要新增的级别");
		return;
		}
		propW.flg = '3';
		propW.setTitle('新增同级');
		propW.show();
	}
	/* 修改指定节点 */
	function editNode() {
		propW.flg = '1';
		var eNode = groupTree.getSelectionModel().getSelectedNode();
		if (eNode) {
			Ext.getCmp('inputText').setValue(eNode.text);
			Ext.getCmp('inputRemarked').setValue(eNode.attributes.remarked);
			Ext.getCmp('inputParm').setValue(eNode.attributes.parm);
			propW.setTitle('编辑');
			propW.show();
		} else {
			Ext.Msg.alert('提示', '请选择要修改的节点');
		}
	}
	/* 删除指定节点 */
	function delNode() {
		var thisNode = groupTree.getSelectionModel().getSelectedNode();
		if (thisNode) {
			if (thisNode.ui.wasLeaf) {
				Ext.Msg.show({
					title : '提示',
					msg : '删除分类可能导致分类下的数据丢失，确定要删除该分类？',
					buttons : Ext.Msg.YESNO,
					fn : function(btn) {
						if (btn == "yes") {
							del(thisNode);
						}
					}
				});
			} else {
				Ext.Msg.show({
					title : '提示',
					msg : '分类包含子分类，该操作仅关联删除下一级分类，若有多级子分类请手动删除后在删除此分类，并且删除分类可能导致分类下的数据丢失，确定要删除？',
					buttons : Ext.Msg.YESNO,
					fn : function(btn) {
						if (btn == "yes") {
							del(thisNode);
						}
					}
				});
			}
		} else {
			Ext.Msg.alert('提示', '请选择要删除的分类节点');
		}
	}
	function del(thisNode) {
		var delUrl = dataUrl + '&methodName=delGroup&paramCount=0';
		var delOb = {
			ccode :thisNode.attributes.clCode
			//cid : groupType,
			//code : thisNode.id
		}
		content_panel.body.mask('正在删除节点...', 'x-mask-loading');
		Ext.http.send(delUrl, function(resText) {
			if (resText == 'success') {
				thisNode.remove();
			} else {
				Ext.Msg.alert('提示', '删除失败:' + resText);
			}
			content_panel.body.unmask();
		}, Ext.encode(delOb));
	}
	/* 改变节点图标状态为文件夹状态，即有子节点状态 */
	function changeIcn(node) {
		node.leaf = false;
		node.ui.wasLeaf = false;
		node.attributes.leaf = false;
	}
	/** **********************用于新增，修改节点的window************************************* */
	var propW = new Ext.Window({
		bodyStyle:'padding:25px 35px 0',
		width : 360,
		height : 270,
		title : '',
		layout : 'form',
		closeAction : 'hide',
		modal : true,
		labelWidth:60,
		//draggable:false,
		//resizable:false,
		items : [{
			xtype : 'textfield',
			id : 'inputText',
			fieldLabel : '名称',
			name : 'inputText',
			maxLength :30,
			maxLengthText:'名称过长，请保持在30个字符以内', 
			width : 200
		},{
			xtype : 'textfield',
			id : 'inputParm',
			fieldLabel : '  参数',
			name : 'inputParm',
			maxLength :30,
			maxLengthText:'参数信息过长，请保持在30个字符以内', 
			width : 200
		},{
			xtype:'textarea',
			id : 'inputRemarked',
			fieldLabel : '  备注',
			name : 'inputRemarked',
			maxLength :100,
			maxLengthText:'备注信息过长，请保持在30个字符以内', 
			width : 200,
			height:100
		}],
		tbar : ['', {
			text : '保存',
			iconCls : 'save',
			handler : function() {
				// 增加节点
				if (propW.flg == '0') {
					var text = Ext.getCmp('inputText').getValue();
					var remarked = Ext.getCmp('inputRemarked').getValue();
					var parm = Ext.getCmp('inputParm').getValue();
					
					if (Ext.util.Format.trim(text).length == 0) {
						Ext.getCmp('inputText').markInvalid('名称不能为空!');
						return false;
					}
					else if(Ext.util.Format.trim(text).length>30){
						Ext.getCmp('inputText').markInvalid('名称过长，请保持在30个字符以内');
						return false;
					}
					var node = new Ext.tree.AsyncTreeNode({
						text : text,
						remarked : remarked,
						leaf : true
					});
					var pNode = groupTree.getSelectionModel().getSelectedNode();
					
					if (pNode) {
						pNode.appendChild(node);
						pNode.expand();
					} else {
						pNode = groupTree.root;
						pNode.appendChild(node);
					}
					// 该次操作的数据，将被保存于obj中传递到后台
					var sendObj = {
						cid : groupType,
						pid : pNode.id,
						preid : node.previousSibling
								? node.previousSibling.id
								: '0',
						text : node.text,
						remarked :remarked,
						parm : parm
					}
					var addUrl = dataUrl + '&methodName=addGroup&paramCount=0';
					content_panel.body.mask('正在新增节点...', 'x-mask-loading');
					Ext.http.send(addUrl, function(resText) {
						if (resText == 'success') {
							groupTree.root.reload();
						} else {
							pNode.removeChild(node);
							Ext.Msg.alert('提示', '新增节点失败：' + resText);
						}
						content_panel.body.unmask();
					}, Ext.encode(sendObj));

				}else if (propW.flg == '3') {//新增同级
					var text = Ext.getCmp('inputText').getValue();
					var remarked = Ext.getCmp('inputRemarked').getValue();
					var parm = Ext.getCmp('inputParm').getValue();
					if (Ext.util.Format.trim(text).length == 0) {
						Ext.getCmp('inputText').markInvalid('名称不能为空!');
						return false;
					}
					else if(Ext.util.Format.trim(text).length>30){
						Ext.getCmp('inputText').markInvalid('名称过长，请保持在30个字符以内');
						return false;
					}
					var node = new Ext.tree.AsyncTreeNode({
						text : text,
						leaf : true
					});
					var pNode = groupTree.getSelectionModel().getSelectedNode().parentNode;
					var preida=pNode.lastChild.id;
					if (pNode) {
						pNode.appendChild(node);
						pNode.expand();
					} else {
						pNode = groupTree.root;
						pNode.appendChild(node);
					}
					// 该次操作的数据，将被保存于obj中传递到后台
					var sendObj = {
						cid : groupType,
						pid : pNode.id,
						text : node.text,
						parm : parm,
						remarked : remarked
					}
					var addUrl = dataUrl + '&methodName=addGroup&paramCount=0';
					content_panel.body.mask('正在新增节点...', 'x-mask-loading');
					Ext.http.send(addUrl, function(resText) {
						if (resText == 'success') {
							groupTree.root.reload();
						} else {
							pNode.removeChild(node);
							Ext.Msg.alert('提示', '新增节点失败：' + resText);
						}
						content_panel.body.unmask();
					}, Ext.encode(sendObj));
				}// 修改节点
				else if (propW.flg == '1') {
					var eNode = groupTree.getSelectionModel().getSelectedNode();
					
					if (eNode) {
						var text = Ext.getCmp('inputText').getValue();
						var remarked = Ext.getCmp('inputRemarked').getValue();
						var parm = Ext.getCmp('inputParm').getValue();
						if (Ext.util.Format.trim(text).length == 0) {
							Ext.getCmp('inputText').markInvalid('名称不能为空!');
							return false;
						}
						
						var editUrl = dataUrl
								+ '&methodName=updateGroup&paramCount=0';
						var editOb = {
							remarked : remarked,
							ccode : eNode.attributes.clCode,
							text : text,
							parm : parm
						};
						content_panel.body.mask('正在编辑节点...', 'x-mask-loading');
						Ext.http.send(editUrl, function(resText) {
							if (resText == 'success')
								eNode.setText(text);
							else
								Ext.Msg.alert('提示', '修改节点失败:' + resText);
							content_panel.body.unmask();
						}, Ext.encode(editOb));

					} else {
						Ext.Msg.alert('提示', '请选择要修改的节点');
					}
				}
				propW.hide();
			}
		}
		]
	});
	propW.on('hide', function() {
		Ext.getCmp('inputText').setValue('');
		Ext.getCmp('inputRemarked').setValue('');
		Ext.getCmp('inputParm').setValue('');
	});

	var content_panel = new Ext.Panel({
		layout : 'border',
		items : [groupTree]
	});

	return {
		getDGMCmp : function() {
			return content_panel;
		}
	}
};

/** ***************调用*************************** */
Ext.onReady(function() {
	if (!g_id || g_id == null || g_id == '' || g_id == 'null') {
		Ext.Msg.alert('提示', '分类类别未确定,请在地址后输入分类编号如：*.jsp?id=12 ');
		return false;
	}
	var dg = new DGroupManage(g_id);
	var gp = dg.getDGMCmp();

	var viewport = new Ext.Viewport({
		layout : 'fit',
		items : [gp]
	});
});